
module.exports = function(db){
	var express = require('express');
	var path = require('path');
	var favicon = require('static-favicon');
	var logger = require('morgan');
	var cookieParser = require('cookie-parser');
	var bodyParser = require('body-parser');
	var mongo = require('mongodb');
	
	var routes = require(__dirname + '/routes/index');
	var dirname = __dirname;
	
	var app = express();
	
	// view engine setup
	app.set('port', process.env.PORT || 80);
	app.set('views', path.join(__dirname, 'views'));
	app.set('view engine', 'jade');
	
	app.use(favicon());
	app.use(logger('dev'));
	app.use(bodyParser.json());
	app.use(bodyParser.urlencoded());
	app.use(cookieParser());
	app.use(express.static(path.join(__dirname, 'public')));
	
	//Make our db accessible to our router
	app.use(function(req,res,next){
	    req.db = db;
	    //This needs to be here for the views rendered in angular
	    req.abs_path = dirname;
	    //This is a function that can be run optionally after a view is loaded
	    next();
	});
	
	app.use('/', routes);
	//app.use('/users', users);
	
	/// catch 404 and forwarding to error handler
	app.use(function(req, res, next) {
	    var err = new Error('Not Found');
	    err.status = 404;
	    next(err);
	});
	
	/// error handlers
	
	// development error handler
	// will print stacktrace
	if (app.get('env') === 'development') {
	    app.use(function(err, req, res, next) {
	        res.status(err.status || 500);
	        res.render('error', {
	            message: err.message,
	            error: err
	        });
	    });
	}
	
	// production error handler
	// no stacktraces leaked to user
	app.use(function(err, req, res, next) {
	    res.status(err.status || 500);
	    res.render('error', {
	        message: err.message,
	        error: {}
	    });
	});
	
	return app;
}
